(function($) {
	var textarea, staticOffset;
	var iLastMousePos = 0;
	var iMin = 32;
	var grip;
	$.fn.TextAreaResizer = function() {
		return this
				.each(function() {
					textarea = $(this).addClass('processed'),
							staticOffset = null;
					$(this)
							.wrap(
									'<div class="resizable-textarea"><span></span></div>')
							.parent().append(
									$('<div class="grippie"></div>').bind(
											"mousedown", {
												el : this
											}, startDrag));
					var grippie = $('div.grippie', $(this).parent())[0];
					grippie.style.marginRight = (grippie.offsetWidth - $(this)[0].offsetWidth)
							+ 'px'
				})
	};
	function startDrag(e) {
		textarea = $(e.data.el);
		textarea.blur();
		iLastMousePos = mousePosition(e).y;
		staticOffset = textarea.height() - iLastMousePos;
		textarea.css('opacity', 0.25);
		$(document).mousemove(performDrag).mouseup(endDrag);
		return false
	}
	function performDrag(e) {
		var iThisMousePos = mousePosition(e).y;
		var iMousePos = staticOffset + iThisMousePos;
		if (iLastMousePos >= (iThisMousePos)) {
			iMousePos -= 5
		}
		iLastMousePos = iThisMousePos;
		iMousePos = Math.max(iMin, iMousePos);
		textarea.height(iMousePos + 'px');
		if (iMousePos < iMin) {
			endDrag(e)
		}
		return false
	}
	function endDrag(e) {
		$(document).unbind('mousemove', performDrag).unbind('mouseup', endDrag);
		textarea.css('opacity', 1);
		textarea.focus();
		textarea = null;
		staticOffset = null;
		iLastMousePos = 0
	}
	function mousePosition(e) {
		return {
			x : e.clientX + document.documentElement.scrollLeft,
			y : e.clientY + document.documentElement.scrollTop
		}
	}
})(jQuery);